package com.task.submitter.tasks;

import org.springframework.stereotype.Component;

@Component
public class VoltageFluxService {

	public VoltageFluxData processVoltageFluxTask(int dim, double temperature, int steps){
		VoltageFluxData data = new VoltageFluxData(dim, temperature);
		process(steps, data);
		return data;
	}
	
	/* Wykonuje jedna iteracje obliczen - jeden krok czasowy problemu
	 *	Wartosci nie zmieniane to: brzeg siatki oraz punkty ustawiane w 
	 *	funkcji InitTempDistribution.
	 */
	private void processOneIteration(VoltageFluxData data){
		int rDimension = data.getrDimension();
		double[][] rGrid = data.getrGrid();
		double[][] rGridTemp = data.getrGridTemp();
		
		/// Przelicz nowa siatke (wypelniajac tymczasowa)
		for (int row = 0; row < rDimension; row++) {
			for (int col = 0; col < rDimension; col++) {
				if(row >0 && row < rDimension-1 && col >0 && col < rDimension-1){
					rGridTemp[row][col] = 0.25*(rGrid[row-1][col]+rGrid[row][col-1]+rGrid[row+1][col]+rGrid[row][col+1]);
				} 
			}
		}
		
		/// Przepisz tymczasowa siatke do glownej:
		for (int row = 0; row < rDimension; row++) {
			for (int col = 0; col < rDimension; col++) {
				rGrid[row][col] =  rGridTemp[row][col];
			}
		}
		
		/// Przywroc oryginalne wartosci temperatury w punktach, w ktorych nie ma sie ona zmieniac (jest stala).
		data.initTempDistribution(data.getrInitTemp());
	}
	
	private void process(Integer steps, VoltageFluxData data){
	    long startTime = System.currentTimeMillis();
		for (int s = 0; s < steps; s++) {
			processOneIteration(data);
			if ( 1 > 0){
				System.out.println( "Step #" + s + ":" );
				data.print();
			}
		}
		long endTime = System.currentTimeMillis();
	    data.setrProcessingTime(endTime-startTime);
	  }
	
}
